#include <iostream>
using namespace std;
#include <signal.h>
#include <unistd.h>
//屏蔽信号已经解除屏蔽信号
int main()
{
    pid_t id=getpid();
    cout<<"pid is:"<<id<<endl;

    //1. 屏蔽信号前的准备工作
    //1.1先把需要屏蔽的信号写入结构体内
    sigset_t bset,oset;//设置oset为了取消屏蔽
    //信号集函数
    sigemptyset(&bset);
   sigemptyset(&oset);//对信号集进行清空处理
    for(int i=1;i<32;i++)//对1~31号信号进行屏蔽
    {sigaddset(&bset,i);}//这一步只是准备好数据而已，并没有屏蔽

    //2.调用系统调用接口，进行屏蔽信号（信号三个表的数据存在于内核，对内核数据的访问需要系统调用接口，当调用系统调用接口时，当前进程身份由用户态转换为内核态）
    int n3=sigprocmask(SIG_SETMASK,&bset,&oset);//这一步已经屏蔽掉了
    if(n3<0)return -2;

    //3.不停获取pending并打印，同时给进程发信号
    sigset_t pending;//用来获取pending
    while(true)//不停打印pending
    {
       int n4= sigpending(&pending);
       if(n4<0)continue;//获取失败继续获取
       else{
        //获取成功打印
        for(int i=31;i>0;i--)
        {
        if(sigismember(&pending,i))//判断内核中的pending是否存在i信号
        {
            cout<<"1";
        }
        else
        cout<<"0";
        }
        cout<<endl;
        sleep(1);
       }
    }
    return 0;
}